#ifndef GEN_MIPS_H
#define GEN_MIPS_H

	#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>
	#include "tableGencode.h"
	#include "../tableSymbole/hashTable.h"
	#include "pourGestionPile.h"
	#include "variableADeclarer.h"
	
	int nbLabelPourGenMips;
	
	//initialise la génération mips
	void initGenMips ();
	//va générer le code mips
	void mipsGeneration(FILE * out);
	
	//va générer la partie data (déclaration des variables)
	void dataGeneration (FILE * out);
	
	//va générer la partie text (code)
	void textGeneration (FILE * out);
	//va générer une fonction avant le label main
	int functionGeneration(FILE * out, int debut);
	//va tester la commande et rediriger vers la fonction de génération associée
	void parsingInstruction(FILE * out, int indexGenMips);
	//va générer une instruction addition
	void codeAdditionGeneration (FILE * out, int indexGenMips);
	//va générer une instruction multiplication
	void codeMultiplicationGeneration (FILE * out, int indexGenMips);
	//va générer une instruction moins unaire
	void codeMoinsUnaireGeneration (FILE * out, int indexGenMips);
	//va générer une instruction affectation
	void codeAffectationGeneration (FILE * out, int indexGenMips);
	//va générer une instruction affectation valeur
	void codeAffectationValGeneration (FILE * out, int indexGenMips);
	//va générer une instruction ecriture
	void codeEcritureGeneration (FILE * out, int indexGenMips);
	//va générer une instruction ecriture valeur
	void codeEcritureValGeneration (FILE * out, int indexGenMips);
	//va générer une instruction d'empilement
	void codeChargeDanslaPileGeneration (FILE * out, int indexGenMips);
	//va générer une instruction de dépilement
	void codeChargeDeLaPileGeneration (FILE * out, int indexGenMips);
	//va générer une instruction non logique
	void codeNonLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction de ou logique
	void codeOuLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction de et logique
	void codeEtLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction de xor logique
	void codeXorLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction d'egalité logique
	void codeEgalLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction de différence logique
	void codeDifferentLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction d'infériorité logique
	void codePpetitLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction d'infériorité stricte logique
	void codePpetitsLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction de supériorité logique
	void codePgrandLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction de supériorité stricte logique
	void codePgrandsLogiqueGeneration (FILE * out, int indexGenMips);
	//va générer une instruction d'écriture de valeur logique 
	void codeEcritureBoolGeneration (FILE * out, int indexGenMips);
	//va générer une instruction d'écriture de vrai logique
	void codeEcritureVraiGeneration (FILE * out, int indexGenMips);
	//va générer une instruction d'écriture de faux logique 
	void codeEcritureFauxGeneration (FILE * out, int indexGenMips);
	//va générer une instruction if id = 0 goto label
	void codeIfGeneration (FILE * out, int indexGenMips);
	//va générer une instruction label
	void codeLabelGeneration (FILE * out, int indexGenMips);
	//va générer une instruction goto label
	void codeJumpGeneration (FILE * out, int indexGenMips);
	//va générer une instruction sw $a[0-3], <nom>
	void codeChargerDeParametreGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction lw $a[0-3], <nom>
	void codeChargerDansParametreGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction pour sauver $ra dans la pile
	void codeSauveRAGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction pour charger $ra de la pile
	void codeChargeRAGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction d'appel à une fonction
	void codeAppelFonctionGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction lw $v1, <nom>
	void codeChargeResultatDansGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction sw $v1, <nom>
	void codeChargeResultatDeGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction read d'un entier
	void codeReadEntierGeneration(FILE * out, int indexGenMips);	
	//va générer une instruction read d'un booleen (0 ou autre)
	void codeReadBooleenGeneration(FILE * out, int indexGenMips);
	
#endif
